package com.mini.grpc.server;

import java.util.concurrent.TimeUnit;

/**
 * Mini-gRPC服务端接口
 * 定义服务端的基本操作
 * 
 * @author Mini-gRPC
 */
public interface Server {
    
    /**
     * 启动服务端
     * 
     * @return 服务端实例
     * @throws IllegalStateException 如果服务端已经启动
     */
    Server start();
    
    /**
     * 获取监听端口
     * 
     * @return 端口号，如果服务端未启动则返回-1
     */
    int getPort();
    
    /**
     * 获取所有服务定义
     * 
     * @return 服务定义列表
     */
    java.util.List<ServerServiceDefinition> getServices();
    
    /**
     * 获取不可变的服务定义列表
     * 
     * @return 不可变的服务定义列表
     */
    java.util.List<ServerServiceDefinition> getImmutableServices();
    
    /**
     * 优雅关闭服务端
     * 不再接受新的连接，但会等待现有连接完成
     * 
     * @return 服务端实例
     */
    Server shutdown();
    
    /**
     * 立即关闭服务端
     * 强制关闭所有连接
     * 
     * @return 服务端实例
     */
    Server shutdownNow();
    
    /**
     * 判断服务端是否已关闭
     * 
     * @return 如果已关闭返回true
     */
    boolean isShutdown();
    
    /**
     * 判断服务端是否已终止
     * 
     * @return 如果已终止返回true
     */
    boolean isTerminated();
    
    /**
     * 等待服务端终止
     * 
     * @throws InterruptedException 如果等待被中断
     */
    void awaitTermination() throws InterruptedException;
    
    /**
     * 等待服务端终止，带超时时间
     * 
     * @param timeout 超时时间
     * @param unit 时间单位
     * @return 如果在超时时间内终止返回true，否则返回false
     * @throws InterruptedException 如果等待被中断
     */
    boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
} 